import axios from 'axios';
import { ElLoading } from 'element-plus';
import router from '@/router'
import Message from '../utils/Message'
const contentTypeForm = 'application/x-www-form-urlencoded;charset=UTF-8'
const contentTypeJson = 'application/json'
// arraybuffer ArrayBuffer对象
// blob Blob对象
const responseTypeJson = "json"

let loading = null;
const instance = axios.create({
    // 如果不存在跨域问题并且在.env.xxx文件中有配置的话baseURL的值可以直接使用：process.env.BASE_URL；
    //如果使用proxy做了代理配置，那么baseURL的值直接填写'/'就可以了。
    baseURL: '/api',
    timeout: 10 * 1000,
    // headers: { // 主要进行相关请求头信息配置
    //     'Content-Type': 'application/json;charset=UTF-8',
    //     'token': ''
    // }
})

// 请求前拦截器
instance.interceptors.request.use(
    (config) => {
        if (config.showLoading) {
            loading = ElLoading.service({
                lock: true,
                text: '少女祈祷中......',
                background: 'rgba(0,0,0,0.7)'
            });
        }
        return config;
    },
    (error) => {
        if (config.showLoading && loading) {
            loading.close();
        }
        Message.error('请求发送失败');
        return Promise.reject("请求发送失败");
    }
);
// 请求后拦截器（响应拦截器）
instance.interceptors.response.use(
    (response) => {

        const { showLoading, errorCallback, showError = true, responseType } = response.config;
        if (showLoading && loading) {
            loading.close()
        }
        const responseData = response.data;
        // 在线浏览返回的数据为blob
        if (responseType == 'arraybuffer' || responseType == 'blob') {
            return responseData;
        }
        // 正常请求
        if (responseData.code == 200) {
            return responseData;
        } else if (responseData.code == 901) {
            // 登录超时
            // 登录超时先跳转到登录页面 用户登录完成跳回原来的页面
            router.push("/login?redirectUrl=" + encodeURI(router.currentRoute.value.path));
            return Promise.reject({ showError: false, msg: "登录超时" })
        } else if (responseData.code == 404) {
            // 请求地址出错 或是进入管理员页面
            router.push("/login");
            Message.error("请求地址出错!")
            return Promise.reject({ showError: false, msg: "请求地址出错" })
        } else {
            // 其他错误
            if (errorCallback) {
                errorCallback(responseData.info);
            }
            return Promise.reject({ showError: showError, msg: responseData.info })
        }
    },
    (error) => {
        if (error.config.showLoading && loading) {
            loading.close();
        }
        return Promise.reject({ showError: true, msg: "网络异常" })
    }
);
const request = (config) => {
    const { url, params, dataType, showLoading = true, responseType = responseTypeJson } = config;
    let contentType = contentTypeForm;
    let formData = new FormData();//创建form对象
    for (let key in params) {
        formData.append(key, params[key] == undefined ? "" : params[key]);
    }
    if (dataType != null && dataType == 'json') {
        contentType = contentTypeJson;
    }
    let headers = {
        'Content-Type': contentType,
        'X-Requested-with': 'XMLHttpRequest'
    }
    return instance.post(url, formData, {
        // 上传
        onUploadProgress: (event) => {
            if (config.uploadProgressCallback) {
                config.uploadProgressCallback(event);
            }
        },
        responseType: responseType,
        headers: headers,
        showLoading: showLoading,
        errorCallback: config.errorCallback,
        showError: config.showError
    }).catch(error => {

        console.log(error);
        if (error.showError) {
            Message.error(error.msg);
        }
        return null;

    });
};

// 最后将service对象抛出去就行
export default request;
